/**
 * 基于SMTP协议发送邮件
 *
 * 输入参数:
 *  to：      收件人
 *  subject： 邮件主题
 *  html：    html格式的邮件正文
 *  text：    纯文本格式的邮件正文。如果同时指定了html参数，则text会被忽略
 *
 * 输出参数:
 *  true：发送成功
 */
(() => {
  // 私有区域
  const MimeMessage = Host.type('MimeKit.MimeMessage', 'MimeKit');
  const MailboxAddress = Host.type('MimeKit.MailboxAddress', 'MimeKit');
  const TextPart = Host.type('MimeKit.TextPart', 'MimeKit');
  const SmtpClient = Host.type('MailKit.Net.Smtp.SmtpClient', 'MailKit');

  return function ({ to, subject, html, text }) {
    // 验证输入参数
    if (!to) throw Error('缺失收件人信息');

    const server = A.setting('smtp.host');
    if (!server) throw Error('缺失邮件服务器设置信息(smtp.host)');
    const ssl = A.setting('smtp.useSsl') === 'true';
    const port = A.setting('smtp.port') ?? (ssl ? 465 : 25);
    const user = A.setting('smtp.user');
    if (!user) throw Error('缺失邮件发信人设置信息(smtp.user)');
    const name = A.setting('smtp.name');
    const password = A.setting('smtp.password');

    // 封装邮件信息
    const Message = new MimeMessage();
    Message.From.Add(new MailboxAddress(name ?? user.split('@')[0], user));
    Message.To.Add(new MailboxAddress(to.split('@')[0], to));
    Message.Subject = subject;
    const part = new TextPart(html ? "html" : "plain");
    part.Text = html ?? text;
    Message.Body = part;

    // 发送邮件
    const Client = new SmtpClient();
    Client.Connect(server, port, ssl);
    if (password) Client.Authenticate(user, password);
    Client.Send(Message);
    Client.Disconnect(true);

    // 返回结果
    return true;
  };
})()